package io.scal.secureshareui.controller; import timber.log.Timber; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Handler; import android.util.Log; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.Upload; import com.amazonaws.services.s3.transfer.model.UploadResult; import java.io.File; import java.util.HashMap; import io.scal.secureshareui.model.Account; import io.scal.secureshareuilibrary.R; public class S3SiteController extends SiteController { private static final String TAG = "S3SiteController"; public static final String SITE_NAME = "S3"; public static final String SITE_KEY = "s3"; private ClientConfiguration s3Config = new ClientConfiguration(); public S3SiteController(Context context, Handler handler, String jobId) { super(context, handler, jobId); } @Override public void startAuthentication(Account account) { /* Intent intent = new Intent(mContext, S3.class); intent.putExtra(SiteController.EXTRAS_KEY_CREDENTIALS, account.getCredentials()); ((Activity) mContext).startActivityForResult(intent, SiteController.CONTROLLER_REQUEST_CODE); // FIXME not a safe cast, context might be a service */ } @Override public void upload(Account account, HashMap<String, String> valueMap) { String mediaPath = valueMap.get(VALUE_KEY_MEDIA_PATH); boolean useTor = valueMap.get(VALUE_KEY_USE_TOR).equals("true"); //set proxy useTor=false; //FIXME Hardcoded until we find a Tor workaround if(super.torCheck(useTor, super.mContext)) { s3Config.setProtocol(Protocol.HTTP); s3Config.setProxyHost(ORBOT_HOST); s3Config.setProxyPort(ORBOT_HTTP_PORT); } new AmazonS3UploadTask().execute(mediaPath); } private class AmazonS3UploadTask extends AsyncTask<String, Integer, UploadResult> { String bucket; String pathPrefix; @Override protected UploadResult doInBackground(String... mediaPaths) { UploadResult result = null; if(null == mediaPaths[0]) { jobFailed(null, 7000000, "S3 media path is null"); return result; } File mediaFile = new File(mediaPaths[0]); if (!mediaFile.exists()) { jobFailed(null, 7000001, "S3 media path invalid"); return result; } try { final AWSCredentials credentials = new BasicAWSCredentials(mContext.getString(R.string.s3_key), mContext.getString(R.string.s3_secret)); Log.i(TAG, "upload file: " + mediaFile.getName()); AmazonS3Client s3Client = new AmazonS3Client(credentials, s3Config); TransferManager transferManager = new TransferManager(s3Client); Upload upload = transferManager.upload(bucket, pathPrefix + mediaFile.getName(), mediaFile); result = upload.waitForUploadResult(); } catch (Exception e) { Timber.e("upload error: " + e.getMessage()); jobFailed(null, 7000002, "S3 upload failed: " + e.getMessage()); } return result; } @Override protected void onPreExecute() { bucket = mContext.getString(R.string.s3_bucket); pathPrefix = mContext.getString(R.string.s3_path_prefix); } @Override protected void onProgressUpdate(Integer... values) { } @Override protected void onPostExecute(UploadResult result) { if(null != result) { Log.i(TAG, "upload result: " + result.getKey()); String url = "https://s3-us-west-1.amazonaws.com/" + bucket + "/" + result.getKey(); jobSucceeded(url); } else { jobFailed(null, 7000002, "S3 upload failed: PostExecute"); } } } @Override public void startMetadataActivity(Intent intent) { return; // nop } }